interface Options {
  scheduler?: Function
}

// 副作用函数
let activeEffect: Function

export const effect = (fn: Function, options: Options) => {
  const _effect = function () {
    activeEffect = _effect
    const res = fn()
    return res
  }

  _effect.options = options
  _effect()
  return _effect
}

// 依赖收集
const targetMap = new WeakMap()

export const track = (target, key) => {
  let depsMap = targetMap.get(target)
  if (!depsMap) {
    depsMap = new Map()
    targetMap.set(target, depsMap)
  }

  let deps = depsMap.get(key)
  if (!deps) {
    deps = new Set()
    depsMap.set(key, deps)
  }

  deps.add(activeEffect)
}

// 触发依赖
export const trigger = (target, key) => {
  const depsMap = targetMap.get(target)
  const deps = depsMap.get(key)

  deps.forEach(effect => {
    if (effect?.options?.scheduler) {
      effect?.options?.scheduler()
    } else {
      effect()
    }
  });
}